#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>


void sig_int(int signo) /* 信号处理函数 */
{
	printf("\nreceived SIGINT!<%d>\n", signo);
    //sleep(3);
    printf("sleep end\n");
}

int sigaction_test() {

    struct sigaction act;
    memset(&act, 0x00, sizeof(act));
    act.sa_handler = sig_int;
    sigaddset(&act.sa_mask, SIGQUIT);
    sigaction(SIGINT, &act, nullptr);
    while(1);
    return 0;
}

int signal_test()
{
	sigset_t newmask, oldmask;
	if (signal(SIGINT, sig_int) == SIG_ERR) /* 绑定信号 */
	    perror("signal(SIGINT) error!");

	sigemptyset(&newmask);
	sigaddset(&newmask, SIGINT);

	if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) /* 屏蔽newmask,将当前的保存到oldmask */
	    perror("sigprocmask(SIG_BLOCK) error!");

	sleep(3); /* 休眠3秒 */

	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) /*恢复成oldmask */
	    perror("sigprocmask(SIG_SETMASK) error!");

    while(1);
	return 0;
}

int main(int argc, const char **argv) {
    return signal_test();
}
